package com.wtgroup.demo.mianshi.容器.map;

import org.junit.Test;

import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;

/**
 * @author dafei
 * @version 0.1
 * @date 2021/4/27 12:12
 */
public class D_LinkedHashMap {

    /**
     * 一、有序性, 以及如何保证?
     */
    @Test
    public void func1() {
        LinkedHashMap linkedHashMap = new LinkedHashMap();
        linkedHashMap.put("k", 1);
        linkedHashMap.put("a", 1);
        linkedHashMap.put("m", 1);
        // ? 再次 put k , 会改变它的顺序吗 ?
        // linkedHashMap.put("k", 2);
        Iterator iterator = linkedHashMap.entrySet().iterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + ", ");
        }
        System.out.println();

        HashMap hashMap = new HashMap();
        hashMap.put("k", 1);
        hashMap.put("a", 1);
        hashMap.put("m", 1);
        // hashMap.put("k", 2);
        Iterator iterator2 = hashMap.entrySet().iterator();
        while (iterator2.hasNext()) {
            System.out.print(iterator2.next() + ", ");
        }
        System.out.println();
        // => a=1, k=1, m=1,
    }

    /**
     * 二、access-order 和 insertion-order，保证访问顺序和插入顺序
     * 访问顺序：最后访问的，越靠后。
     * 插入顺序：最后插入的，越靠后。
     */
    @Test
    public void func2() {
        boolean accessOrder = true;
        LinkedHashMap linkedHashMap = new LinkedHashMap(16, 0.75F, accessOrder);
        linkedHashMap.put("k", 1);
        linkedHashMap.put("a", 1);
        linkedHashMap.put("m", 1);
        // ? 再次 put k , 会改变它的顺序吗 ?
        // A: accessOrder = true , 已存在的节点在put时, 因为扫描到了, 即 access 了, 那么就认为它应该更加新, 故移动到双链表尾部.
        // linkedHashMap.put("k", 2);
        linkedHashMap.get("k");
        Iterator iterator = linkedHashMap.entrySet().iterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + ", ");
        }
        System.out.println();
        // => a=1, m=1, k=2,
    }



}
